/*
 * Copyright 2013 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef SkDiscardableMemoryPool_DEFINED
#define SkDiscardableMemoryPool_DEFINED

#include "include/private/base/SkMutex.h"
#include "include/private/chromium/SkDiscardableMemory.h"

#ifndef SK_LAZY_CACHE_STATS
#ifdef SK_DEBUG
#define SK_LAZY_CACHE_STATS 1
#else
#define SK_LAZY_CACHE_STATS 0
#endif
#endif

/* *
 * An implementation of Discardable Memory that manages a fixed-size
 * budget of memory.  When the allocated memory exceeds this size,
 * unlocked blocks of memory are purged.  If all memory is locked, it
 * can exceed the memory-use budget.
 */
class SkDiscardableMemoryPool : public SkDiscardableMemory::Factory {
public:
    virtual size_t getRAMUsed() = 0;
    virtual void setRAMBudget(size_t budget) = 0;
    virtual size_t getRAMBudget() = 0;

    /* * purges all unlocked DMs */
    virtual void dumpPool() = 0;

#if SK_LAZY_CACHE_STATS
    /* *
     * These two values are a count of the number of successful and
     * failed calls to SkDiscardableMemory::lock() for all DMs managed
     * by this pool.
     */
    virtual int getCacheHits() = 0;
    virtual int getCacheMisses() = 0;
    virtual void resetCacheHitsAndMisses() = 0;
#endif

    /* *
     * This non-global pool can be used for unit tests to verify that
     * the pool works.
     */
    static sk_sp<SkDiscardableMemoryPool> Make(size_t size);
};

/* *
 * Returns (and creates if needed) a threadsafe global
 * SkDiscardableMemoryPool.
 */
SkDiscardableMemoryPool *SkGetGlobalDiscardableMemoryPool();

#if !defined(SK_DEFAULT_GLOBAL_DISCARDABLE_MEMORY_POOL_SIZE)
#define SK_DEFAULT_GLOBAL_DISCARDABLE_MEMORY_POOL_SIZE (128 * 1024 * 1024)
#endif

#endif
// SkDiscardableMemoryPool_DEFINED
